home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / graph3D / graph3D source / openMandel.c < prev    next >
Text File  |  1993-09-17  |  3KB  |  157 lines

  1. /*
  2.     Copyright '89    Christopher Moll
  3.     all rights reserved
  4. */
  5.  
  6.  
  7. #include    "graph3D.h"
  8.  
  9. extern    int        numX, numY;
  10.  
  11. extern    Real    startX, startY;
  12. extern    Real    endX, endY;
  13. extern    Real    deltaX, deltaY;
  14. extern    int        numX, numY;
  15.  
  16. extern    Vector        maxVect, minVect;
  17.  
  18. extern    Real        *funcResults;
  19. extern    Boolean        vectrsCurrent;
  20.  
  21. OpenMandel()
  22. {
  23. static    Point    where = {100, 100};
  24.     long        theList[4];
  25.     SFReply        theReply;
  26.     FILE        *rdFile;
  27.     Boolean        StoreMandelPts(), GetMandHeader();
  28.     int            maxDwell;
  29.  
  30.     theList[0] = 'ManD';
  31.     
  32.     SFGetFile(where, "", NIL, 1, theList, NIL, &theReply);
  33.     if (theReply.good)
  34.     {
  35.         SetVol(NIL, theReply.vRefNum);
  36.         rdFile = fopen(ptoc((char *)theReply.fName), "r");
  37.         if (rdFile)
  38.         {
  39.             if (NOT(GetMandHeader(rdFile, &maxDwell)))
  40.                 goto Fail;
  41.             if (NOT(StoreMandelPts(rdFile, maxDwell)))
  42.                 goto Fail;
  43.  
  44. Fail:        fclose(rdFile);
  45.             vectrsCurrent = FALSE;
  46.             InvalidGraph();
  47.         }
  48.     }
  49. }
  50.  
  51. static
  52. Boolean
  53. GetMandHeader(rdFile, maxDwellP)
  54. FILE    *rdFile;
  55. int        *maxDwellP;
  56. {
  57.     FileSection    fileHead;
  58.     CoordBlock    cblock;
  59.     int            rdReslt;
  60.     char        dump[78];
  61.     Boolean        AllocatePts();
  62.  
  63.     rdReslt = fread(&fileHead, sizeof(FileSection), 1, rdFile);
  64.     rdReslt = fread(&cblock, sizeof(CoordBlock), 1, rdFile);
  65.     rdReslt = fread(&dump, 78, 1, rdFile);
  66.  
  67.     numX = cblock.height;
  68.     numY = cblock.width;
  69.     deltaX = cblock.maxDwell / 10.0;
  70.     deltaY = cblock.maxDwell / 10.0;
  71.     if (NOT(AllocatePts()))
  72.     {
  73.         MemAlert();
  74.         return(FALSE);
  75.     }
  76.     *maxDwellP = cblock.maxDwell;
  77.     return(TRUE);
  78. }
  79.  
  80. static
  81. Boolean
  82. StoreMandelPts(rdFile, maxDwell)
  83. FILE    *rdFile;
  84. int        maxDwell;
  85. {
  86.     register    int    xCnt, yCnt, dwellVal;
  87.     Real        currX, currY;
  88.     int            maxFunc, minFunc;
  89.     Real        xAtMax, yAtMax;
  90.     Real        xAtMin, yAtMin;
  91.     int            rdReslt, offSet;
  92.     int            *dwells;
  93.     Boolean        CmndPeriod();
  94.  
  95.     dwells = (int    *)NewPtr((long)numX * (long)numY * sizeof(int));
  96.     if (MemErr)
  97.         return(FALSE);
  98.     rdReslt = fread(dwells, numX * sizeof(int), numY, rdFile);
  99.     if (rdReslt NEQ numY)
  100.     {
  101.         DisposPtr(dwells);
  102.         return(FALSE);
  103.     }
  104.  
  105.     maxFunc = dwells[0];
  106.     minFunc = dwells[0];
  107.     xAtMax = startX;
  108.     yAtMax = startY;
  109.     xAtMin = startX;
  110.     yAtMin = startY;
  111.  
  112.     currX = startX;
  113. {FILE    *wrt;
  114. wrt=fopen("wrt","w");
  115.  
  116.     for (xCnt = 0; xCnt < numX; xCnt++)
  117.     {
  118.         currY = startY;
  119.         for (yCnt = 0; yCnt < numY; yCnt++)
  120.         {
  121.             offSet = (long)xCnt * numY + (long)yCnt;
  122.             dwellVal = dwells[offSet];
  123.             if (dwellVal > maxDwell)
  124.                 dwellVal = maxDwell;
  125. fprintf(wrt, "%d\t", dwellVal);
  126.             funcResults[offSet] = dwellVal;
  127.             if (dwellVal > maxFunc)
  128.             {
  129.                 maxFunc = dwellVal;
  130.                 xAtMax = currX;
  131.                 yAtMax = currY;
  132.             }
  133.             else if (dwellVal < minFunc)
  134.             {
  135.                 minFunc = dwellVal;
  136.                 xAtMin = currX;
  137.                 yAtMin = currY;
  138.             }
  139.             currY += deltaY;
  140.         }
  141. fprintf(wrt, "\n");
  142.         if (CmndPeriod())
  143.             break;  /* for */
  144.         currX += deltaX;
  145.     }
  146. fclose(wrt);
  147. }
  148.     maxVect.x = xAtMax;
  149.     maxVect.y = yAtMax;
  150.     maxVect.z = maxFunc;
  151.     minVect.x = xAtMin;
  152.     minVect.y = yAtMin;
  153.     minVect.z = minFunc;
  154.     DisposPtr(dwells);
  155.     return(TRUE);
  156. }
  157.